package fr.afcepf.al23.qualite.data;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.sql.DataSource;

import fr.afcepf.al23.qualite.entity.Utilisateur;

/**
 * Implementation JDBC.
 * @author stagiaires
 *
 */
public class DaoUtilisateur implements IDaoUtilisateur {
    /**
     * DataSource pour la connection a la BDD.
     */
    private DataSource ds = new QualiteDataSource();
    /**
     * Requete de verification des parametres de connexion.
     */
    private final String reqConnection = "SELECT * FROM Utilisateur WHERE mail = ? AND mdp = ?";
    /**
     * Indice du parametre 'mail' dans la requete
     * {@link DaoUtilisateur#reqConnection}.
     */
    private final int indiceParamMailReqConnect = 1;
    /**
     * Indice du parametre 'mail' dans la requete
     * {@link DaoUtilisateur#reqConnection}.
     */
    private final int indiceParamMdpReqConnect = 2;
    /**
     * Requete de verification des parametres de connexion.
     */
    private final String reqEnregistrement = "INSERT INTO Utilisateur (nom, mail, mdp, adresse) VALUE (?, ?, ?, ?)";
    /**
     * Indice du parametre 'nom' dans la requete
     * {@link DaoUtilisateur#reqEnregistrement}.
     */
    private final int indiceParamNomReqEnreg = 1;
    /**
     * Indice du parametre 'mail' dans la requete
     * {@link DaoUtilisateur#reqEnregistrement}.
     */
    private final int indiceParamMailReqEnreg = 2;
    /**
     * Indice du parametre 'mdp' dans la requete
     * {@link DaoUtilisateur#reqEnregistrement}.
     */
    private final int indiceParamMdpReqEnreg = 3;
    /**
     * Indice du parametre 'adresse' dans la requete
     * {@link DaoUtilisateur#reqEnregistrement}.
     */
    private final int indiceParamAdresseReqEnreg = 4;
    /**
     * Requete de verification du mail.
     */
    private final String reqVerificationMail = "SELECT * FROM Utilisateur WHERE mail = ?";
    /**
     * Indice du parametre 'mail' dans la requete
     * {@link DaoUtilisateur#reqVerificationMail}.
     */
    private final int indiceParamMailReqVerifMail = 1;
    /**
     * Nom de la colonne 'id' de la table 'Utilisateur'.
     */
    private final String colonneId = "id";
    /**
     * Nom de la colonne 'nom' de la table 'Utilisateur'.
     */
    private final String colonneNom = "nom";
    /**
     * Nom de la colonne 'mail' de la table 'Utilisateur'.
     */
    private final String colonneMail = "mail";
    /**
     * Nom de la colonne 'mdp' de la table 'Utilisateur'.
     */
    private final String colonneMdp = "mdp";
    /**
     * Nom de la colonne 'adresse' de la table 'Utilisateur'.
     */
    private final String colonneAdresse = "adresse";
    @Override
    public Utilisateur seConnecter(String paramMail, String paramMdp) {
        Utilisateur user = null;
        Connection cnx = null;
        try {
            cnx = ds.getConnection();
            PreparedStatement pstmt = cnx.prepareStatement(reqConnection);
            pstmt.setString(indiceParamMailReqConnect, paramMail);
            pstmt.setString(indiceParamMdpReqConnect, paramMdp);
            ResultSet rs = pstmt.executeQuery();
            if (rs.next()) {
                user = rsToUtilisateur(rs);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                cnx.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return user;
    }
    /**
     * Methode pour convertir une ligne du Resultset en
     * objet de type {@link Utilisateur}.
     * @param paramRs le resultset ouvert a un enregistrement.
     * @return l'objet {@link Utilisateur}.
     * @throws SQLException si une erreur lors de la lecture de l'enregistrement.
     */
    private Utilisateur rsToUtilisateur(ResultSet paramRs) throws SQLException {
        Utilisateur user = new Utilisateur(paramRs.getInt(colonneId),
                                           paramRs.getString(colonneNom),
                                           paramRs.getString(colonneMail),
                                           paramRs.getString(colonneMdp),
                                           paramRs.getString(colonneAdresse));
        return user;
    }
    @Override
    public Utilisateur enregistrer(Utilisateur paramUtil) {
        Utilisateur user = null;
        Connection cnx = null;
        try {
            cnx = ds.getConnection();
            PreparedStatement pstmt = cnx.prepareStatement(reqEnregistrement);
            pstmt.setString(indiceParamNomReqEnreg, paramUtil.getNom());
            pstmt.setString(indiceParamMailReqEnreg, paramUtil.getMail());
            pstmt.setString(indiceParamMdpReqEnreg, paramUtil.getMdp());
            pstmt.setString(indiceParamAdresseReqEnreg, paramUtil.getAdresse());
            ResultSet rs = pstmt.executeQuery();
            if (rs.next()) {
                user = rsToUtilisateur(rs);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                cnx.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return user;
    }
    @Override
    public boolean verifierMail(String paramMail) {
        boolean existenceMail = false;
        Connection cnx = null;
        try {
            cnx = ds.getConnection();
            PreparedStatement pstmt = cnx.prepareStatement(reqVerificationMail);
            pstmt.setString(indiceParamMailReqVerifMail, paramMail);
            ResultSet rs = pstmt.executeQuery();
            if (rs.next()) {
                existenceMail = true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                cnx.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return existenceMail;
    }
}
